package body Plateaux
is
   --Renvoie vrai si la cellule (X;Y) est libre
   function Libre (Un_Plateau: Plateau ; X : colonne;  Y : ligne ) return Boolean is
   begin
      return Cellules.Libre	(Un_Plateau.Un_Contenu (Y , X ));
   end Libre;

   -- Renvoie l'occupant[X|O] d'une cellule (X;Y)
   function Occupant (Un_Plateau : Plateau ; X : Colonne ; Y : Ligne ) return cellules.Symbole is
   begin
      return Cellules.Occupant (Un_Plateau.Un_Contenu (Y , X ));
   end Occupant ;

   -- Renvoie vrai si la cellule (X;Y) contiens le symbole Un_Symbole
   function Occupe_Par (Un_Plateau : Plateau; X: Colonne ; Y : Ligne;Un_Symbole: Cellules.Symbole) return Boolean is
      function "=" (X, Y : Cellules.Symbole) return Boolean renames Cellules."=";
   begin
      return (not Cellules.Libre (Un_Plateau.Un_Contenu (Y , X))) and then (Cellules.Occupant (Un_Plateau.Un_Contenu (Y,  X ))= Un_Symbole );
   end Occupe_Par ;
  
   --Place le symbole Un-Symbole a la case (X;Y) du plateau
   procedure Tracer(Un_Plateau : in out Plateau; X: in Colonne; Y: in Ligne; Un_Symbole: in Cellules.Symbole ) is
   begin
      Cellules.Tracer(Un_Plateau.Un_Contenu (Y , X), Un_Symbole); 
      Un_Plateau.Nombre_Coups := Un_Plateau.Nombre_Coups + 1;
   end Tracer ;

   --rencoie la collone qui suis X
   function Voisin_Colonne (X : Colonne ) return Colonne  is
   begin
      if X = Colonne'Last then 
         return Colonne'First;	 
      else 
         return Colonne'Succ (X); end if;	 
   end Voisin_Colonne;


   --renvoie la ligne qui suis Y
   function Voisin_Ligne (Y : Ligne) return Ligne is
   begin
      if Y = ligne'Last then 
         return ligne'First;
      else 
         return Ligne'Succ (Y); 
      end if;
   end Voisin_Ligne ;


   -- 
   function Tester (Un_Plateau: Plateau; X: Colonne; Y: Ligne ; Un_Symbole: in Cellules.Symbole ) return Boolean  is
      
      -- bloc qui ne sert a rien : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      function Voisin_Colonne (X : Colonne ) return Colonne  is
      begin
         if X = Colonne'Last then
            return Colonne'First;
         else 
            return Colonne'Succ (X); 
         end if;
      end Voisin_Colonne;

      
      function Voisin_Ligne (Y : Ligne ) return Ligne is
      begin
         if Y = Ligne'Last then
            return Ligne'First;
         else 
            return Ligne'Succ (Y); 
         end if;
      end Voisin_Ligne;
      -- <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      
      function "=" (X, Y : Cellules.Symbole) return boolean renames cellules."=";

      use Cellules;
   begin

      return(Occupe_Par (Un_Plateau, Voisin_Colonne(X), Y, Un_Symbole ) and then Occupe_Par (Un_Plateau, Voisin_Colonne (Voisin_Colonne(X)), Y , Un_Symbole ))
        or else(Occupe_Par (Un_Plateau, X, Voisin_Ligne(Y), Un_Symbole) and then Occupe_Par(Un_Plateau, X , Voisin_Ligne (Voisin_Ligne(Y)), Un_Symbole ))
        or else((abs (Colonne'Pos (X) - Ligne'Pos (Y)) /= 1) and then Occupe_Par (Un_Plateau , Voisin_Colonne (X), Voisin_Ligne (Y ), Un_Symbole) 
                and then Occupe_Par (Un_Plateau, Voisin_Colonne (Voisin_Colonne(X )), Voisin_Ligne (Voisin_Ligne(Y )), Un_Symbole ));
   end Tester ;



   function Plein (Un_Plateau: Plateau ) return Boolean is
   begin
      return Un_Plateau.Nombre_Coups = Numero_Coup'Last;
   end Plein ;
end Plateaux  ;
